{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# Solar System\n",
    "\n",
    "[![Google Collab Book](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/tum-pbs/PhiFlow/blob/develop/docs/Planets_Tutorial.ipynb)\n",
    "\n",
    "\n",
    "This demo simulates the gravitational pull between multiple massive bodies.\n",
    "We will use Euler steps in time which do not preserve energy.\n",
    "\n",
    "[**Φ-Flow**](https://github.com/tum-pbs/PhiFlow)\n",
    "&nbsp;&nbsp;&nbsp; [**Documentation**](https://tum-pbs.github.io/PhiFlow/)\n",
    "&nbsp;&nbsp;&nbsp; [**API**](https://tum-pbs.github.io/PhiFlow/phi)\n",
    "&nbsp;&nbsp;&nbsp; [**Demos**](https://github.com/tum-pbs/PhiFlow/tree/master/demos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# !pip install phiflow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "We use the convenience import of Φ<sub>Flow</sub> which imports the core submodules, such as `math` and `vis`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "from phi.flow import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Let's define the initial positions for our planets.\n",
    "We stack the position vectors of the planets a long a new [*instance*](https://tum-pbs.github.io/PhiFlow/Math.html#shapes) dimension we call *planets*.\n",
    "Φ<sub>Flow</sub> also allows us to name the individual elements along that dimension. These names are part of the shape and will be present on all tensors derived from `x` that have this dimension."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[94m(x=0, y=0)\u001B[0m; \u001B[94m(x=10, y=0)\u001B[0m; \u001B[94m(x=0, y=12)\u001B[0m \u001B[92m(planetsⁱ=Sun,Earth,Mars, vectorᶜ=x,y)\u001B[0m"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = stack({'Sun': (0, 0), 'Earth': (10, 0), 'Mars': (0, 12)}, instance('planets'))\n",
    "x = rename_dims(x, 'vector', channel(vector='x,y'))\n",
    "x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "We can plot these positions by constructing a `PointCloud`, using the `bounds` parameter to specify the axis range. Since the universe we are simulating is infinite, the `bounds` have no physical meaning in this case."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>",
      "image/png": "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o4i4pYI5JKl4dY90Zl6WmcMzswWYADyYmV+o9xyS1Ah8nrQkFaypyoNn5kPAQ1XOIEkl80xakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpmpCWpYEZakgpW90hHxOERMScilkTEUxExtd4zSFKjaKrgmF3A32Xmgog4EJgfEQ9k5uIKZpGkotX9TDozV2fmgtrXrwNLgGH1nkOSGkGla9IR0QKMBh7bwWVTIqIjIjo6OzvrPpsklaCySEfEAcAdwFcy87XtL8/M6ZnZlpltzc3N9R9QkgpQSaQj4j10B/rWzPxxFTNIUiOo4tkdAXwfWJKZ19f7+JLUSKo4kz4JmAj8UUQsrH2cWcEcklS8uj8FLzP/FYh6H1eSGpGvOJSkghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYkZakghlpSSqYka6Tb37zmxx33HGMGjWK1tZWHnvssapHkvZIgwYNorW1dfPHtdde26fb33nnnSxevHjzdnt7Ox0dHf095i5rquzIe5FHH32Uu+++mwULFjB48GBeeukl3n777arHkvZI++23HwsXLtyt23Z1dXHnnXcyduxYjj322P4dbDd5Jl0Hq1evZujQoQwePBiAoUOHcthhh9HS0sJLL70EQEdHB+3t7QBcddVVTJ48mfb2do488ki+853vVDW6tMe45pprOP744xkxYgRTpkwhM4HuM+XLL7+cT3/603zrW9/irrvu4uKLL6a1tZVf//rXANx+++2ccMIJHHXUUcydO7eucxvpOjjttNNYuXIlRx11FBdeeCEPP/zwTm+zdOlSfv7znzNv3jyuvvpqNmzYUIdJpca3bt26bZY7fvjDHwJw0UUX8fjjj7No0SLWrVvH3Xffvfk2r776Kg8//DBXXHEF48aNY9q0aSxcuJAPf/jDQPcZ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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "vis.plot(PointCloud(x, bounds=Box(x=(-2, 12), y=(-1, 13))))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Next, let's give the planets initial velocities so that they circle the sun.\n",
    "For a nice plot, we pass the vector-valued velocities as the `values` of our `PointCloud`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>"
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "v = math.rotate_vector(x, PI/2)\n",
    "v = math.divide_no_nan(v, math.vec_length(v))\n",
    "vis.plot(PointCloud(x, values=v, bounds=Box(x=(-2, 12), y=(-1, 13))))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Next, we define the masses of our planets which will determine the gravitational pull.\n",
    "These also allow us to make our plot prettier by passing a `Sphere` as the elements of the `PointCloud`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>"
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "masses = math.stack({'Sun': 1000, 'Earth': 10, 'Mars': 10}, instance('planets'))\n",
    "vis.plot(PointCloud(Sphere(x, radius=masses**0.333 * .2), bounds=Box(x=(-2, 12), y=(-1, 13))))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "To Simulate our system, we define a simple update step, `simulation`, and iterate it to produce the position and velocity trajectories `xs` and `vs`.\n",
    "We use `iterate` instead of a `for`-loop because `iterate` can also stack all intermediate values to give us the full trajectory along the newly-defined `time` axis.\n",
    "This saves us from creating two lists, adding every element and manually stacking the values.\n",
    "\n",
    "Inside the simulation step, `math.pairwise_distances` computes all body-body distances, adding a new instance dimension with the name `others` by default."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[92m(timeᵇ=101, planetsⁱ=Sun,Earth,Mars, vectorᶜ=x,y)\u001B[0m \u001B[94m8.559 ± 24.659\u001B[0m \u001B[37m(-6e+01...7e+01)\u001B[0m"
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def simulate(x, v, dt=.5):\n",
    "    dx = math.pairwise_distances(x)\n",
    "    a = .01 * math.sum(math.divide_no_nan(math.rename_dims(masses, 'planets', 'others') * dx, math.vec_squared(dx) ** 1.5), 'others')\n",
    "    return x + v * dt, v + a * dt\n",
    "\n",
    "xs, vs = iterate(simulate, batch(time=100), x, v)\n",
    "xs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Let's plot the system trajectory as an animation!\n",
    "We can use the `time` dimension created above for the animation.\n",
    "Using `vis.overlay` allows us to plot multiple fields in one figure."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<matplotlib.animation.FuncAnimation at 0x2808723e700>",
      "text/html": "<video width=\"864\" height=\"360\" controls autoplay loop>\n  <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAAQ61tZGF0AAACrwYF//+r\n3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2MSByMzA0OCBiODZhZTNjIC0gSC4yNjQvTVBF\nRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4u\nb3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFs\neXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVk\nX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBk\nZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEx\nIGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50\nZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBi\nX3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29w\nPTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0xMCBzY2VuZWN1dD00MCBpbnRyYV9y\nZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0w\nLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAA\nDphliIQAEP/+94G/MstfIrrJcfnnfSyszzzkPHJdia640AAAAwAAAwAAAwAGIxI3/ofxeM38AAAD\nAAC3PZ4884JyCTMAV6BvqEgDeyGXaIH2pFC2c5GYjSa9wqWt2X8sl8L/xVMGeaRbssS2cDAoVuZD\njVvYsq123/AkCn/vW/fLdNeNL4G/DqIkPPvfhSbsNqwKcf+0iwDUPU3eu+Oe2o5sd2BImYGke41S\n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\nHWRhdGEAAAABAAAAAExhdmY1OC43Ny4xMDA=\n\">\n  Your browser does not support the video tag.\n</video>"
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 0 Axes>"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "vis.plot(vis.overlay(\n",
    "    PointCloud(Sphere(xs, radius=masses ** 0.333 / 5), bounds=Box(x=(-20, 20), y=(-20, 20))),\n",
    "    PointCloud(xs, vs * 2, bounds=Box(x=(-20, 20), y=(-20, 20)))), animate='time', frame_time=100)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}